@@ -2,7 +2,6 @@  | 
            ||
| 2 | 2 | 
                 | 
            
| 3 | 3 | 
                from curtail_uuid import CurtailUUID  | 
            
| 4 | 4 | 
                from django.contrib import admin  | 
            
| 5 | 
                -from django.contrib.auth.hashers import make_password  | 
            |
| 6 | 5 | 
                from django.db import transaction  | 
            
| 7 | 6 | 
                 | 
            
| 8 | 7 | 
                from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLoginLogInfo, TourGuideInfo,  | 
            
                @@ -10,7 +9,8 @@ from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLogin  | 
            ||
| 10 | 9 | 
                 | 
            
| 11 | 10 | 
                 | 
            
| 12 | 11 | 
                class LensmanInfoAdmin(admin.ModelAdmin):  | 
            
| 13 | 
                -    readonly_fields = ('lensman_id', 'encryption', )
               | 
            |
| 12 | 
                +    exclude = ('username', 'password', 'encryption')
               | 
            |
| 13 | 
                +    readonly_fields = ('lensman_id', )
               | 
            |
| 14 | 14 | 
                     list_display = ('lensman_id', 'unionid', 'username', 'name', 'sex', 'phone', 'location', 'proportion', 'nomark', 'origin', 'balance', 'user_status', 'status', 'created_at', 'updated_at')
               | 
            
| 15 | 15 | 
                     search_fields = ('name', 'phone', 'location')
               | 
            
| 16 | 16 | 
                     list_filter = ('sex', 'user_status', 'status')
               | 
            
                @@ -41,11 +41,6 @@ class LensmanInfoAdmin(admin.ModelAdmin):  | 
            ||
| 41 | 41 | 
                setattr(user, key, value)  | 
            
| 42 | 42 | 
                user.save()  | 
            
| 43 | 43 | 
                 | 
            
| 44 | 
                - if obj.password:  | 
            |
| 45 | 
                - obj.encryption = make_password(obj.password, None, 'pbkdf2_sha256')  | 
            |
| 46 | 
                - obj.password = None  | 
            |
| 47 | 
                - obj.save()  | 
            |
| 48 | 
                -  | 
            |
| 49 | 44 | 
                 | 
            
| 50 | 45 | 
                class LensmanLoginLogInfoAdmin(admin.ModelAdmin):  | 
            
| 51 | 46 | 
                     list_display = ('lensman_id', 'login_ip', 'login_result', 'status', 'created_at', 'updated_at')
               | 
            
                @@ -0,0 +1,49 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +from __future__ import unicode_literals  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +from django.db import models, migrations  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +class Migration(migrations.Migration):  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                + dependencies = [  | 
            |
| 10 | 
                +        ('account', '0022_auto_20170212_2153'),
               | 
            |
| 11 | 
                + ]  | 
            |
| 12 | 
                +  | 
            |
| 13 | 
                + operations = [  | 
            |
| 14 | 
                + migrations.AddField(  | 
            |
| 15 | 
                + model_name='userinfo',  | 
            |
| 16 | 
                + name='openid_lensman',  | 
            |
| 17 | 
                + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u6444\u5f71\u5e08\u7aef', unique=True, verbose_name='openid_lensman', db_index=True),  | 
            |
| 18 | 
                + ),  | 
            |
| 19 | 
                + migrations.AddField(  | 
            |
| 20 | 
                + model_name='userinfo',  | 
            |
| 21 | 
                + name='openid_miniapp',  | 
            |
| 22 | 
                + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u5c0f\u7a0b\u5e8f', unique=True, verbose_name='openid_miniapp', db_index=True),  | 
            |
| 23 | 
                + ),  | 
            |
| 24 | 
                + migrations.AddField(  | 
            |
| 25 | 
                + model_name='userinfo',  | 
            |
| 26 | 
                + name='openid_oauth',  | 
            |
| 27 | 
                + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u7528\u6237\u6388\u6743', unique=True, verbose_name='openid_oauth', db_index=True),  | 
            |
| 28 | 
                + ),  | 
            |
| 29 | 
                + migrations.AddField(  | 
            |
| 30 | 
                + model_name='userinfo',  | 
            |
| 31 | 
                + name='openid_tourguide',  | 
            |
| 32 | 
                + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u5bfc\u6e38\u7aef', unique=True, verbose_name='openid_tourguide', db_index=True),  | 
            |
| 33 | 
                + ),  | 
            |
| 34 | 
                + migrations.AlterField(  | 
            |
| 35 | 
                + model_name='userinfo',  | 
            |
| 36 | 
                + name='openid',  | 
            |
| 37 | 
                + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u7528\u6237\u7aef', unique=True, verbose_name='openid', db_index=True),  | 
            |
| 38 | 
                + ),  | 
            |
| 39 | 
                + migrations.AlterField(  | 
            |
| 40 | 
                + model_name='userinfo',  | 
            |
| 41 | 
                + name='unionid',  | 
            |
| 42 | 
                + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Unionid', unique=True, verbose_name='unionid', db_index=True),  | 
            |
| 43 | 
                + ),  | 
            |
| 44 | 
                + migrations.AlterField(  | 
            |
| 45 | 
                + model_name='userinfo',  | 
            |
| 46 | 
                + name='user_from',  | 
            |
| 47 | 
                + field=models.IntegerField(default=0, help_text='\u7528\u6237\u6765\u6e90', verbose_name='user_from', choices=[(0, 'APP \u521b\u5efa\u7528\u6237'), (1, '\u5fae\u4fe1\u6388\u6743\u7528\u6237'), (8, '\u7528\u6237\u7aef\u7528\u6237'), (9, '\u6e38\u5ba2\u7528\u6237'), (10, '\u6444\u5f71\u5e08\u7aef\u7528\u6237'), (11, '\u5bfc\u6e38\u7aef\u7528\u6237'), (12, '\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (13, '\u7f51\u9875\u6388\u6743\u7528\u6237')]),  | 
            |
| 48 | 
                + ),  | 
            |
| 49 | 
                + ]  | 
            
                @@ -229,18 +229,22 @@ class WechatInfo(CreateUpdateMixin):  | 
            ||
| 229 | 229 | 
                class UserInfo(CreateUpdateMixin):  | 
            
| 230 | 230 | 
                APP_USER = 0  | 
            
| 231 | 231 | 
                WX_USER = 1  | 
            
| 232 | 
                + USER_USER = 8  | 
            |
| 232 | 233 | 
                GUEST_USER = 9  | 
            
| 233 | 234 | 
                LENSMAN_USER = 10  | 
            
| 234 | 235 | 
                TOURGUIDE_USER = 11  | 
            
| 235 | 
                - WEAPP_USER = 12  | 
            |
| 236 | 
                + MINIAPP_USER = 12  | 
            |
| 237 | 
                + OAUTH_USER = 13  | 
            |
| 236 | 238 | 
                 | 
            
| 237 | 239 | 
                USER_FROM = (  | 
            
| 238 | 240 | 
                (APP_USER, u'APP 创建用户'),  | 
            
| 239 | 241 | 
                (WX_USER, u'微信授权用户'),  | 
            
| 242 | 
                + (USER_USER, u'用户端用户'),  | 
            |
| 240 | 243 | 
                (GUEST_USER, u'游客用户'),  | 
            
| 241 | 
                - (LENSMAN_USER, u'摄影师用户'),  | 
            |
| 242 | 
                - (TOURGUIDE_USER, u'导游用户'),  | 
            |
| 243 | 
                - (WEAPP_USER, u'小程序用户'),  | 
            |
| 244 | 
                + (LENSMAN_USER, u'摄影师端用户'),  | 
            |
| 245 | 
                + (TOURGUIDE_USER, u'导游端用户'),  | 
            |
| 246 | 
                + (MINIAPP_USER, u'小程序端用户'),  | 
            |
| 247 | 
                + (OAUTH_USER, u'网页授权用户'),  | 
            |
| 244 | 248 | 
                )  | 
            
| 245 | 249 | 
                 | 
            
| 246 | 250 | 
                UNVERIFIED = 0  | 
            
                @@ -273,8 +277,12 @@ class UserInfo(CreateUpdateMixin):  | 
            ||
| 273 | 277 | 
                username = models.CharField(_(u'username'), max_length=255, blank=True, null=True, help_text=u'用户用户名', db_index=True, unique=True)  | 
            
| 274 | 278 | 
                password = models.CharField(_(u'password'), max_length=255, blank=True, null=True, help_text=u'用户密码')  | 
            
| 275 | 279 | 
                # 微信授权用户  | 
            
| 276 | 
                - openid = models.CharField(_(u'openid'), max_length=255, blank=True, null=True, help_text=u'微信 Open ID', db_index=True, unique=True)  | 
            |
| 277 | 
                - unionid = models.CharField(_(u'unionid'), max_length=255, blank=True, null=True, help_text=u'微信 Union ID', db_index=True, unique=True)  | 
            |
| 280 | 
                + unionid = models.CharField(_(u'unionid'), max_length=255, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True)  | 
            |
| 281 | 
                + openid = models.CharField(_(u'openid'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱用户端', db_index=True, unique=True)  | 
            |
| 282 | 
                + openid_lensman = models.CharField(_(u'openid_lensman'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱摄影师端', db_index=True, unique=True)  | 
            |
| 283 | 
                + openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱导游端', db_index=True, unique=True)  | 
            |
| 284 | 
                + openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱小程序', db_index=True, unique=True)  | 
            |
| 285 | 
                + openid_oauth = models.CharField(_(u'openid_oauth'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱用户授权', db_index=True, unique=True)  | 
            |
| 278 | 286 | 
                # 用户基本信息  | 
            
| 279 | 287 | 
                name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名')  | 
            
| 280 | 288 | 
                sex = models.IntegerField(_(u'sex'), choices=SEX_TYPE, default=MALE, help_text=u'用户性别')  | 
            
                @@ -324,7 +332,7 @@ class UserInfo(CreateUpdateMixin):  | 
            ||
| 324 | 332 | 
                return self.name  | 
            
| 325 | 333 | 
                elif self.user_from == self.TOURGUIDE_USER:  | 
            
| 326 | 334 | 
                return self.name  | 
            
| 327 | 
                - elif self.user_from == self.WEAPP_USER:  | 
            |
| 335 | 
                + elif self.user_from == self.MINIAPP_USER:  | 
            |
| 328 | 336 | 
                return self.nickname  | 
            
| 329 | 337 | 
                return self.nickname  | 
            
| 330 | 338 | 
                 | 
            
                @@ -3,6 +3,7 @@  | 
            ||
| 3 | 3 | 
                from __future__ import division  | 
            
| 4 | 4 | 
                 | 
            
| 5 | 5 | 
                from django.conf import settings  | 
            
| 6 | 
                +from django.db import transaction  | 
            |
| 6 | 7 | 
                from logit import logit  | 
            
| 7 | 8 | 
                 | 
            
| 8 | 9 | 
                from account.models import TourGuideInfo, UserInfo  | 
            
                @@ -47,32 +48,25 @@ def tourguide_submit_api(request):  | 
            ||
| 47 | 48 | 
                 | 
            
| 48 | 49 | 
                 | 
            
| 49 | 50 | 
                @logit  | 
            
| 51 | 
                +@transaction.atomic  | 
            |
| 50 | 52 | 
                def tourguide_wx_authorize_api(request):  | 
            
| 51 | 
                -    unionid = request.POST.get('unionid', '')
               | 
            |
| 52 | 
                -    openid = request.POST.get('openid', '')
               | 
            |
| 53 | 
                -  | 
            |
| 54 | 
                -    sex = request.POST.get('sex', 0)
               | 
            |
| 55 | 
                -    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
               | 
            |
| 56 | 
                -    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
               | 
            |
| 57 | 
                -    country = request.POST.get('country', '')
               | 
            |
| 58 | 
                -    province = request.POST.get('province', '')
               | 
            |
| 59 | 
                -    city = request.POST.get('city', '')
               | 
            |
| 60 | 
                -  | 
            |
| 61 | 53 | 
                try:  | 
            
| 62 | 
                - user = UserInfo.objects.get(unionid=unionid, istourguide=True, status=True)  | 
            |
| 54 | 
                +        user = UserInfo.objects.select_for_update().get(unionid=request.POST.get('unionid', ''), istourguide=True, status=True)
               | 
            |
| 63 | 55 | 
                except UserInfo.DoesNotExist:  | 
            
| 64 | 56 | 
                return response(TourGuideStatusCode.TOURGUIDE_NOT_FOUND)  | 
            
| 65 | 57 | 
                 | 
            
| 58 | 
                + # 用户是否激活  | 
            |
| 66 | 59 | 
                if user.user_status != UserInfo.ACTIVATED:  | 
            
| 67 | 60 | 
                return response(TourGuideStatusCode.TOURGUIDE_NOT_ACTIVATED)  | 
            
| 68 | 61 | 
                 | 
            
| 69 | 
                - user.openid = openid  | 
            |
| 70 | 
                - user.sex = sex  | 
            |
| 71 | 
                - user.nickname = nickname  | 
            |
| 72 | 
                - user.avatar = avatar  | 
            |
| 73 | 
                - user.country = country  | 
            |
| 74 | 
                - user.province = province  | 
            |
| 75 | 
                - user.city = city  | 
            |
| 62 | 
                + # Set User Key's Value  | 
            |
| 63 | 
                +    user.openid_tourguide = request.POST.get('openid', '')
               | 
            |
| 64 | 
                +    user.sex = request.POST.get('sex', 0)
               | 
            |
| 65 | 
                +    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
               | 
            |
| 66 | 
                +    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
               | 
            |
| 67 | 
                +    user.country = request.POST.get('country', '')
               | 
            |
| 68 | 
                +    user.province = request.POST.get('province', '')
               | 
            |
| 69 | 
                +    user.city = request.POST.get('city', '')
               | 
            |
| 76 | 70 | 
                user.save()  | 
            
| 77 | 71 | 
                 | 
            
| 78 | 72 | 
                set_profile_info(user)  | 
            
                @@ -1,7 +1,6 @@  | 
            ||
| 1 | 1 | 
                # -*- coding: utf-8 -*-  | 
            
| 2 | 2 | 
                 | 
            
| 3 | 3 | 
                from curtail_uuid import CurtailUUID  | 
            
| 4 | 
                -from django.contrib.auth.hashers import check_password, make_password  | 
            |
| 5 | 4 | 
                from django.contrib.auth.models import Group, User  | 
            
| 6 | 5 | 
                from django.db import transaction  | 
            
| 7 | 6 | 
                from ipaddr import client_ip  | 
            
                @@ -9,195 +8,43 @@ from logit import logit  | 
            ||
| 9 | 8 | 
                from rest_framework import viewsets  | 
            
| 10 | 9 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 11 | 10 | 
                 | 
            
| 12 | 
                -from account.models import LensmanInfo, UserInfo, UserLoginLogInfo  | 
            |
| 11 | 
                +from account.models import LensmanInfo, UserInfo  | 
            |
| 13 | 12 | 
                from account.serializers import GroupSerializer, LensmanInfoSerializer, UserInfoSerializer, UserSerializer  | 
            
| 14 | 13 | 
                from operation.models import GuestEntranceControlInfo  | 
            
| 15 | 
                -from utils.error.errno_utils import LensmanStatusCode, UserStatusCode  | 
            |
| 14 | 
                +from utils.error.errno_utils import UserStatusCode  | 
            |
| 16 | 15 | 
                from utils.error.response_utils import response  | 
            
| 17 | 16 | 
                from utils.redis.rguest import get_guest_entrance_control  | 
            
| 18 | 17 | 
                from utils.redis.rprofile import set_profile_info  | 
            
| 19 | 18 | 
                from utils.version_utils import is_version_match  | 
            
| 20 | 19 | 
                 | 
            
| 21 | 20 | 
                 | 
            
| 22 | 
                -# curl -X POST -F username=xxxxxxx -F password=xxxxxxx http://api.pai.ai/login  | 
            |
| 23 | 
                -@logit  | 
            |
| 24 | 
                -def lensman_login_api(request):  | 
            |
| 25 | 
                -    username = request.POST.get('username', '')
               | 
            |
| 26 | 
                -    password = request.POST.get('password', '')
               | 
            |
| 27 | 
                -  | 
            |
| 28 | 
                - try:  | 
            |
| 29 | 
                - lensman = LensmanInfo.objects.get(username=username, status=True)  | 
            |
| 30 | 
                - except LensmanInfo.DoesNotExist:  | 
            |
| 31 | 
                - return response(LensmanStatusCode.LENSMAN_NOT_FOUND)  | 
            |
| 32 | 
                -  | 
            |
| 33 | 
                - if not check_password(password, lensman.encryption):  | 
            |
| 34 | 
                - return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR)  | 
            |
| 35 | 
                -  | 
            |
| 36 | 
                -    return response(200, 'Login Success', u'登录成功', {
               | 
            |
| 37 | 
                - 'user_id': lensman.lensman_id  | 
            |
| 38 | 
                - })  | 
            |
| 39 | 
                -  | 
            |
| 40 | 
                -  | 
            |
| 41 | 
                -@logit  | 
            |
| 42 | 
                -def user_is_registered_api(request):  | 
            |
| 43 | 
                -    username = request.POST.get('username', '')
               | 
            |
| 44 | 
                -  | 
            |
| 45 | 
                -    return response(200, data={
               | 
            |
| 46 | 
                - 'registered': UserInfo.objects.filter(username=username).exists(),  | 
            |
| 47 | 
                - })  | 
            |
| 48 | 
                -  | 
            |
| 49 | 
                -  | 
            |
| 50 | 
                -@logit  | 
            |
| 51 | 
                -@transaction.atomic  | 
            |
| 52 | 
                -def user_signup_api(request):  | 
            |
| 53 | 
                -    user_id = request.POST.get('user_id', '')
               | 
            |
| 54 | 
                -    username = request.POST.get('username', '')
               | 
            |
| 55 | 
                -    password = request.POST.get('password', '')
               | 
            |
| 56 | 
                -  | 
            |
| 57 | 
                - if UserInfo.objects.filter(username=username).exists():  | 
            |
| 58 | 
                - return response(UserStatusCode.USERNAME_HAS_REGISTERED)  | 
            |
| 59 | 
                -  | 
            |
| 60 | 
                - # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户  | 
            |
| 61 | 
                - signup_ip, signup_at = client_ip(request), tc.utc_datetime()  | 
            |
| 62 | 
                -  | 
            |
| 63 | 
                - try:  | 
            |
| 64 | 
                - user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)  | 
            |
| 65 | 
                - except UserInfo.DoesNotExist:  | 
            |
| 66 | 
                - user = None  | 
            |
| 67 | 
                -  | 
            |
| 68 | 
                - if user and user.user_status == UserInfo.ASSIGN:  | 
            |
| 69 | 
                - user.user_from = UserInfo.APP_USER,  | 
            |
| 70 | 
                - user.username = username  | 
            |
| 71 | 
                - user.password = make_password(password, None, 'pbkdf2_sha256')  | 
            |
| 72 | 
                - user.user_status = UserInfo.ACTIVATED  | 
            |
| 73 | 
                - user.signup_ip = signup_ip  | 
            |
| 74 | 
                - user.signup_at = signup_at  | 
            |
| 75 | 
                - user.save()  | 
            |
| 76 | 
                - else:  | 
            |
| 77 | 
                - user = UserInfo.objects.create(  | 
            |
| 78 | 
                - user_id=CurtailUUID.uuid(UserInfo, 'user_id'),  | 
            |
| 79 | 
                - user_from=UserInfo.APP_USER,  | 
            |
| 80 | 
                - username=username,  | 
            |
| 81 | 
                - password=make_password(password, None, 'pbkdf2_sha256'),  | 
            |
| 82 | 
                - user_status=UserInfo.ACTIVATED,  | 
            |
| 83 | 
                - signup_ip=signup_ip,  | 
            |
| 84 | 
                - signup_at=signup_at,  | 
            |
| 85 | 
                - )  | 
            |
| 86 | 
                -  | 
            |
| 87 | 
                - return response(200, 'Signup Success', u'注册成功', user.data)  | 
            |
| 88 | 
                -  | 
            |
| 89 | 
                -  | 
            |
| 90 | 
                -@logit  | 
            |
| 91 | 
                -@transaction.atomic  | 
            |
| 92 | 
                -def user_login_api(request):  | 
            |
| 93 | 
                -    username = request.POST.get('username', '')
               | 
            |
| 94 | 
                -    password = request.POST.get('password', '')
               | 
            |
| 95 | 
                -  | 
            |
| 96 | 
                - try:  | 
            |
| 97 | 
                - user = UserInfo.objects.select_for_update().get(username=username, status=True)  | 
            |
| 98 | 
                - except UserInfo.DoesNotExist:  | 
            |
| 99 | 
                - return response(UserStatusCode.USER_NOT_FOUND)  | 
            |
| 100 | 
                -  | 
            |
| 101 | 
                - login_ip, login_at = client_ip(request), tc.utc_datetime()  | 
            |
| 102 | 
                -  | 
            |
| 103 | 
                - if not check_password(password, user.password):  | 
            |
| 104 | 
                - UserLoginLogInfo.objects.create(  | 
            |
| 105 | 
                - user_id=user.user_id,  | 
            |
| 106 | 
                - login_ip=login_ip,  | 
            |
| 107 | 
                - login_result=UserLoginLogInfo.PWD_ERROR  | 
            |
| 108 | 
                - )  | 
            |
| 109 | 
                - return response(UserStatusCode.USER_PASSWORD_ERROR)  | 
            |
| 110 | 
                -  | 
            |
| 111 | 
                - UserLoginLogInfo.objects.create(  | 
            |
| 112 | 
                - user_id=user.user_id,  | 
            |
| 113 | 
                - login_ip=login_ip,  | 
            |
| 114 | 
                - login_result=UserLoginLogInfo.SUCCESS  | 
            |
| 115 | 
                - )  | 
            |
| 116 | 
                -  | 
            |
| 117 | 
                - user.login_ip = login_ip  | 
            |
| 118 | 
                - user.login_at = login_at  | 
            |
| 119 | 
                - user.save()  | 
            |
| 120 | 
                -  | 
            |
| 121 | 
                - return response(200, 'Login Success', u'登录成功', user.data)  | 
            |
| 122 | 
                -  | 
            |
| 123 | 
                -  | 
            |
| 124 | 21 | 
                @logit  | 
            
| 125 | 22 | 
                @transaction.atomic  | 
            
| 126 | 23 | 
                def user_wx_authorize_api(request):  | 
            
| 127 | 
                -    user_id = request.POST.get('user_id', '')
               | 
            |
| 128 | 
                -  | 
            |
| 129 | 
                -    unionid = request.POST.get('unionid', '')
               | 
            |
| 130 | 
                -    openid = request.POST.get('wx_uid', '')
               | 
            |
| 131 | 
                -  | 
            |
| 132 | 
                -    sex = request.POST.get('sex', 0)
               | 
            |
| 133 | 
                -    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
               | 
            |
| 134 | 
                -    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
               | 
            |
| 135 | 
                -    country = request.POST.get('country', '')
               | 
            |
| 136 | 
                -    province = request.POST.get('province', '')
               | 
            |
| 137 | 
                -    city = request.POST.get('city', '')
               | 
            |
| 138 | 
                -  | 
            |
| 139 | 
                - try:  | 
            |
| 140 | 
                - user = UserInfo.objects.select_for_update().get(unionid=unionid)  | 
            |
| 141 | 
                - except UserInfo.DoesNotExist:  | 
            |
| 142 | 
                - user = None  | 
            |
| 143 | 
                -  | 
            |
| 144 | 
                - if user:  | 
            |
| 145 | 
                - user.openid = openid  | 
            |
| 146 | 
                - user.sex = sex  | 
            |
| 147 | 
                - user.nickname = nickname  | 
            |
| 148 | 
                - user.avatar = avatar  | 
            |
| 149 | 
                - user.country = country  | 
            |
| 150 | 
                - user.province = province  | 
            |
| 151 | 
                - user.city = city  | 
            |
| 152 | 
                - user.save()  | 
            |
| 153 | 
                -  | 
            |
| 154 | 
                - set_profile_info(user)  | 
            |
| 155 | 
                -  | 
            |
| 156 | 
                - return response(200, 'Login Success', u'登录成功', user.data)  | 
            |
| 157 | 
                -  | 
            |
| 158 | 
                - # unionid 不存在  | 
            |
| 159 | 
                - # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户  | 
            |
| 160 | 
                -  | 
            |
| 161 | 
                - signup_ip, signup_at = client_ip(request), tc.utc_datetime()  | 
            |
| 162 | 
                -  | 
            |
| 163 | 
                - try:  | 
            |
| 164 | 
                - user = UserInfo.objects.select_for_update().get(user_id=user_id)  | 
            |
| 165 | 
                - except UserInfo.DoesNotExist:  | 
            |
| 166 | 
                - user = None  | 
            |
| 167 | 
                -  | 
            |
| 168 | 
                - if user and user.user_status == UserInfo.ASSIGN:  | 
            |
| 169 | 
                - user.user_from = UserInfo.WX_USER  | 
            |
| 170 | 
                - user.openid = openid  | 
            |
| 171 | 
                - user.unionid = unionid  | 
            |
| 172 | 
                - user.sex = sex  | 
            |
| 173 | 
                - user.nickname = nickname  | 
            |
| 174 | 
                - user.avatar = avatar  | 
            |
| 175 | 
                - user.country = country  | 
            |
| 176 | 
                - user.province = province  | 
            |
| 177 | 
                - user.city = city  | 
            |
| 178 | 
                - user.signup_ip = signup_ip  | 
            |
| 179 | 
                - user.signup_at = signup_at  | 
            |
| 180 | 
                - user.save()  | 
            |
| 181 | 
                - else:  | 
            |
| 182 | 
                - user = UserInfo.objects.create(  | 
            |
| 183 | 
                - user_id=CurtailUUID.uuid(UserInfo, 'user_id'),  | 
            |
| 184 | 
                - user_from=UserInfo.WX_USER,  | 
            |
| 185 | 
                - openid=openid,  | 
            |
| 186 | 
                - unionid=unionid,  | 
            |
| 187 | 
                - sex=sex,  | 
            |
| 188 | 
                - nickname=nickname,  | 
            |
| 189 | 
                - avatar=avatar,  | 
            |
| 190 | 
                - country=country,  | 
            |
| 191 | 
                - province=province,  | 
            |
| 192 | 
                - city=city,  | 
            |
| 193 | 
                - user_status=UserInfo.ACTIVATED,  | 
            |
| 194 | 
                - signup_ip=signup_ip,  | 
            |
| 195 | 
                - signup_at=signup_at,  | 
            |
| 196 | 
                - )  | 
            |
| 24 | 
                + # Get or Create User  | 
            |
| 25 | 
                +    user, created = UserInfo.objects.select_for_update().get_or_create(unionid=request.POST.get('unionid', ''))
               | 
            |
| 26 | 
                +  | 
            |
| 27 | 
                + # Set User_id  | 
            |
| 28 | 
                + if created:  | 
            |
| 29 | 
                + user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')  | 
            |
| 30 | 
                +  | 
            |
| 31 | 
                + # Set User Key's Value  | 
            |
| 32 | 
                + user.user_from = UserInfo.USER_USER  | 
            |
| 33 | 
                +    user.openid = request.POST.get('wx_uid', '')
               | 
            |
| 34 | 
                +    user.sex = request.POST.get('sex', 0)
               | 
            |
| 35 | 
                +    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
               | 
            |
| 36 | 
                +    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
               | 
            |
| 37 | 
                +    user.country = request.POST.get('country', '')
               | 
            |
| 38 | 
                +    user.province = request.POST.get('province', '')
               | 
            |
| 39 | 
                +    user.city = request.POST.get('city', '')
               | 
            |
| 40 | 
                + user.user_status = UserInfo.ACTIVATED  | 
            |
| 41 | 
                + user.signup_ip = client_ip(request)  | 
            |
| 42 | 
                + user.signup_at = tc.utc_datetime()  | 
            |
| 43 | 
                + user.save()  | 
            |
| 197 | 44 | 
                 | 
            
| 198 | 
                - set_profile_info(user)  | 
            |
| 45 | 
                + set_profile_info(user)  | 
            |
| 199 | 46 | 
                 | 
            
| 200 | 
                - return response(200, 'Login Success', u'登录成功', user.data)  | 
            |
| 47 | 
                + return response(200, 'User Login Success', u'用户端登录成功', user.data)  | 
            |
| 201 | 48 | 
                 | 
            
| 202 | 49 | 
                 | 
            
| 203 | 50 | 
                @logit  | 
            
                @@ -20,11 +20,6 @@ from wechat import views as wechat_views  | 
            ||
| 20 | 20 | 
                 | 
            
| 21 | 21 | 
                # 帐户相关  | 
            
| 22 | 22 | 
                urlpatterns = [  | 
            
| 23 | 
                - url(r'^login$', account_views.lensman_login_api, name='lensman_login_api'), # 摄影师登录  | 
            |
| 24 | 
                - url(r'^u/is_registered$', account_views.user_is_registered_api, name='user_is_registered_api'), # 用户是否已经注册  | 
            |
| 25 | 
                - url(r'^u/signup$', account_views.user_signup_api, name='user_signup_api'), # 用户注册  | 
            |
| 26 | 
                - url(r'^u/login$', account_views.user_login_api, name='user_login_api'), # 用户登录  | 
            |
| 27 | 
                -  | 
            |
| 28 | 23 | 
                url(r'^u/wx/authorize$', account_views.user_wx_authorize_api, name='user_wx_authorize_api'), # 用户端 - 微信用户授权  | 
            
| 29 | 24 | 
                 | 
            
| 30 | 25 | 
                url(r'^u/guest/status$', op_views.guest_api, name='user_guest_status_api'), # 用户端 - 微游客状态(是否开启)  | 
            
                @@ -34,7 +29,6 @@ urlpatterns = [  | 
            ||
| 34 | 29 | 
                # 摄影师相关  | 
            
| 35 | 30 | 
                urlpatterns += [  | 
            
| 36 | 31 | 
                url(r'^l/submit$', lensman_views.lensman_submit_api, name='lensman_submit_api'), # 摄影师信息提交  | 
            
| 37 | 
                - url(r'^l/login$', lensman_views.lensman_login_api, name='lensman_login_api'), # 摄影师登录  | 
            |
| 38 | 32 | 
                 | 
            
| 39 | 33 | 
                url(r'^l/wx/authorize$', lensman_views.lensman_wx_authorize_api, name='lensman_wx_authorize_api'), # 摄影师端 - 微信用户授权  | 
            
| 40 | 34 | 
                 | 
            
                @@ -3,8 +3,8 @@  | 
            ||
| 3 | 3 | 
                from __future__ import division  | 
            
| 4 | 4 | 
                 | 
            
| 5 | 5 | 
                from curtail_uuid import CurtailUUID  | 
            
| 6 | 
                -from django.contrib.auth.hashers import check_password  | 
            |
| 7 | 6 | 
                from django.db import transaction  | 
            
| 7 | 
                +from ipaddr import client_ip  | 
            |
| 8 | 8 | 
                from isoweek import Week  | 
            
| 9 | 9 | 
                from logit import logit  | 
            
| 10 | 10 | 
                from paginator import pagination  | 
            
                @@ -60,54 +60,27 @@ def lensman_submit_api(request):  | 
            ||
| 60 | 60 | 
                 | 
            
| 61 | 61 | 
                 | 
            
| 62 | 62 | 
                @logit  | 
            
| 63 | 
                -def lensman_login_api(request):  | 
            |
| 64 | 
                - """ 摄影师登录 """  | 
            |
| 65 | 
                -    username = request.POST.get('username', '')
               | 
            |
| 66 | 
                -    password = request.POST.get('password', '')
               | 
            |
| 67 | 
                -  | 
            |
| 68 | 
                - try:  | 
            |
| 69 | 
                - lensman = LensmanInfo.objects.get(username=username, status=True)  | 
            |
| 70 | 
                - except LensmanInfo.DoesNotExist:  | 
            |
| 71 | 
                - return response(LensmanStatusCode.LENSMAN_NOT_FOUND)  | 
            |
| 72 | 
                -  | 
            |
| 73 | 
                - if not check_password(password, lensman.encryption):  | 
            |
| 74 | 
                - return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR)  | 
            |
| 75 | 
                -  | 
            |
| 76 | 
                - try:  | 
            |
| 77 | 
                - user = UserInfo.objects.get(user_id=lensman.lensman_id, status=True)  | 
            |
| 78 | 
                - except UserInfo.DoesNotExist:  | 
            |
| 79 | 
                - return response(LensmanStatusCode.LENSMAN_NOT_FOUND)  | 
            |
| 80 | 
                -  | 
            |
| 81 | 
                - return response(200, 'Login Success', u'登录成功', user.data)  | 
            |
| 82 | 
                -  | 
            |
| 83 | 
                -  | 
            |
| 84 | 
                -@logit  | 
            |
| 63 | 
                +@transaction.atomic  | 
            |
| 85 | 64 | 
                def lensman_wx_authorize_api(request):  | 
            
| 86 | 
                -    unionid = request.POST.get('unionid', '')
               | 
            |
| 87 | 
                -    openid = request.POST.get('openid', '')
               | 
            |
| 88 | 
                -  | 
            |
| 89 | 
                -    sex = request.POST.get('sex', 0)
               | 
            |
| 90 | 
                -    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
               | 
            |
| 91 | 
                -    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
               | 
            |
| 92 | 
                -    country = request.POST.get('country', '')
               | 
            |
| 93 | 
                -    province = request.POST.get('province', '')
               | 
            |
| 94 | 
                -    city = request.POST.get('city', '')
               | 
            |
| 95 | 
                -  | 
            |
| 96 | 65 | 
                try:  | 
            
| 97 | 
                - user = UserInfo.objects.get(unionid=unionid, islensman=True, status=True)  | 
            |
| 66 | 
                +        user = UserInfo.objects.select_for_update().get(unionid=request.POST.get('unionid', ''), islensman=True, status=True)
               | 
            |
| 98 | 67 | 
                except UserInfo.DoesNotExist:  | 
            
| 99 | 68 | 
                return response(LensmanStatusCode.LENSMAN_NOT_FOUND)  | 
            
| 100 | 69 | 
                 | 
            
| 70 | 
                + # 用户是否激活  | 
            |
| 101 | 71 | 
                if user.user_status != UserInfo.ACTIVATED:  | 
            
| 102 | 72 | 
                return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED)  | 
            
| 103 | 73 | 
                 | 
            
| 104 | 
                - user.openid = openid  | 
            |
| 105 | 
                - user.sex = sex  | 
            |
| 106 | 
                - user.nickname = nickname  | 
            |
| 107 | 
                - user.avatar = avatar  | 
            |
| 108 | 
                - user.country = country  | 
            |
| 109 | 
                - user.province = province  | 
            |
| 110 | 
                - user.city = city  | 
            |
| 74 | 
                + # Set User Key's Value  | 
            |
| 75 | 
                +    user.openid_lensman = request.POST.get('openid', '')
               | 
            |
| 76 | 
                +    user.sex = request.POST.get('sex', 0)
               | 
            |
| 77 | 
                +    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
               | 
            |
| 78 | 
                +    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
               | 
            |
| 79 | 
                +    user.country = request.POST.get('country', '')
               | 
            |
| 80 | 
                +    user.province = request.POST.get('province', '')
               | 
            |
| 81 | 
                +    user.city = request.POST.get('city', '')
               | 
            |
| 82 | 
                + user.signup_ip = client_ip(request)  | 
            |
| 83 | 
                + user.signup_at = tc.utc_datetime()  | 
            |
| 111 | 84 | 
                user.save()  | 
            
| 112 | 85 | 
                 | 
            
| 113 | 86 | 
                set_profile_info(user)  | 
            
                @@ -28,40 +28,39 @@ def get_userinfo_api(request):  | 
            ||
| 28 | 28 | 
                     encryptedData = request.POST.get('encryptedData', '')
               | 
            
| 29 | 29 | 
                     iv = request.POST.get('iv', '')
               | 
            
| 30 | 30 | 
                 | 
            
| 31 | 
                +    # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
               | 
            |
| 32 | 
                + # u'city': u'Guangzhou',  | 
            |
| 33 | 
                + # u'country': u'CN',  | 
            |
| 34 | 
                + # u'gender': 1,  | 
            |
| 35 | 
                + # u'language': u'zh_CN',  | 
            |
| 36 | 
                + # u'nickName': u'Band',  | 
            |
| 37 | 
                + # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',  | 
            |
| 38 | 
                + # u'province': u'Guangdong',  | 
            |
| 39 | 
                + # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',  | 
            |
| 40 | 
                +    #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
               | 
            |
| 31 | 41 | 
                userinfo = get_userinfo(appid=appid, secret=secret, code=code, encryptedData=encryptedData, iv=iv)  | 
            
| 32 | 42 | 
                 | 
            
| 33 | 
                - try:  | 
            |
| 34 | 
                -        user = UserInfo.objects.select_for_update().get(unionid=userinfo.get('unionId', ''))
               | 
            |
| 35 | 
                - except UserInfo.DoesNotExist:  | 
            |
| 36 | 
                - user = None  | 
            |
| 43 | 
                + # Get or Create User  | 
            |
| 44 | 
                +    user, created = UserInfo.objects.select_for_update().get_or_create(unionid=userinfo.get('unionId', ''))
               | 
            |
| 37 | 45 | 
                 | 
            
| 38 | 
                - if not user:  | 
            |
| 39 | 
                -        # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
               | 
            |
| 40 | 
                - # u'city': u'Guangzhou',  | 
            |
| 41 | 
                - # u'country': u'CN',  | 
            |
| 42 | 
                - # u'gender': 1,  | 
            |
| 43 | 
                - # u'language': u'zh_CN',  | 
            |
| 44 | 
                - # u'nickName': u'Band',  | 
            |
| 45 | 
                - # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',  | 
            |
| 46 | 
                - # u'province': u'Guangdong',  | 
            |
| 47 | 
                - # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',  | 
            |
| 48 | 
                -        #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
               | 
            |
| 49 | 
                - user = UserInfo.objects.create(  | 
            |
| 50 | 
                - user_id=CurtailUUID.uuid(UserInfo, 'user_id'),  | 
            |
| 51 | 
                - user_from=UserInfo.WX_USER,  | 
            |
| 52 | 
                -            openid=userinfo.get('openId', ''),
               | 
            |
| 53 | 
                -            unionid=userinfo.get('unionId', ''),
               | 
            |
| 54 | 
                -            sex=userinfo.get('gender', 0),
               | 
            |
| 55 | 
                -            nickname=userinfo.get('nickName', ''),
               | 
            |
| 56 | 
                -            avatar=userinfo.get('avatarUrl', ''),
               | 
            |
| 57 | 
                -            country=userinfo.get('country', ''),
               | 
            |
| 58 | 
                -            province=userinfo.get('province', ''),
               | 
            |
| 59 | 
                -            city=userinfo.get('city', ''),
               | 
            |
| 60 | 
                - user_status=UserInfo.ACTIVATED,  | 
            |
| 61 | 
                - signup_ip=client_ip(request),  | 
            |
| 62 | 
                - signup_at=tc.utc_datetime(),  | 
            |
| 63 | 
                - )  | 
            |
| 46 | 
                + # Set User_id  | 
            |
| 47 | 
                + if created:  | 
            |
| 48 | 
                + user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')  | 
            |
| 64 | 49 | 
                 | 
            
| 65 | 
                - set_profile_info(user)  | 
            |
| 50 | 
                + # Set User Key's Value  | 
            |
| 51 | 
                + user.user_from = UserInfo.MINIAPP_USER  | 
            |
| 52 | 
                +    user.openid_miniapp = userinfo.get('openId', '')
               | 
            |
| 53 | 
                +    user.sex = userinfo.get('gender', '')
               | 
            |
| 54 | 
                +    user.nickname = userinfo.get('nickName', '')
               | 
            |
| 55 | 
                +    user.avatar = userinfo.get('avatarUrl', '')
               | 
            |
| 56 | 
                +    user.country = userinfo.get('country', '')
               | 
            |
| 57 | 
                +    user.province = userinfo.get('province', '')
               | 
            |
| 58 | 
                +    user.city = userinfo.get('city', '')
               | 
            |
| 59 | 
                + user.user_status = UserInfo.ACTIVATED  | 
            |
| 60 | 
                + user.signup_ip = client_ip(request)  | 
            |
| 61 | 
                + user.signup_at = tc.utc_datetime()  | 
            |
| 62 | 
                + user.save()  | 
            |
| 63 | 
                +  | 
            |
| 64 | 
                + set_profile_info(user)  | 
            |
| 66 | 65 | 
                 | 
            
| 67 | 66 | 
                return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.data)  | 
            
                @@ -19,6 +19,7 @@ from utils.error.errno_utils import (GroupPhotoStatusCode, OrderStatusCode, User  | 
            ||
| 19 | 19 | 
                from utils.error.response_utils import response  | 
            
| 20 | 20 | 
                from utils.redis.rbrief import set_brief_info  | 
            
| 21 | 21 | 
                from utils.redis.rorder import set_lensman_order_record  | 
            
| 22 | 
                +from utils.wechat_utils import get_user_openid  | 
            |
| 22 | 23 | 
                 | 
            
| 23 | 24 | 
                 | 
            
| 24 | 25 | 
                WECHAT = settings.WECHAT  | 
            
                @@ -33,7 +34,13 @@ def wx_order_create_api(request):  | 
            ||
| 33 | 34 | 
                     photo_id = request.POST.get('photo_id', '')
               | 
            
| 34 | 35 | 
                     photo_type = request.POST.get('photo_type', 'nomark')  # nomark for 去除水印, origin for 获取高清图
               | 
            
| 35 | 36 | 
                 | 
            
| 36 | 
                - photo_type_ = OrderInfo.ORIGIN if photo_type == 'origin' else OrderInfo.NOMARK  | 
            |
| 37 | 
                + photo_type_int = OrderInfo.ORIGIN if photo_type == 'origin' else OrderInfo.NOMARK  | 
            |
| 38 | 
                +  | 
            |
| 39 | 
                + # 用户校验  | 
            |
| 40 | 
                + try:  | 
            |
| 41 | 
                + user = UserInfo.objects.get(user_id=user_id)  | 
            |
| 42 | 
                + except UserInfo.DoesNotExist:  | 
            |
| 43 | 
                + return response(UserStatusCode.USER_NOT_FOUND)  | 
            |
| 37 | 44 | 
                 | 
            
| 38 | 45 | 
                # 群组照片校验  | 
            
| 39 | 46 | 
                try:  | 
            
                @@ -42,7 +49,7 @@ def wx_order_create_api(request):  | 
            ||
| 42 | 49 | 
                return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)  | 
            
| 43 | 50 | 
                 | 
            
| 44 | 51 | 
                # 判断是否重复购买  | 
            
| 45 | 
                - if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_, from_uid=user_id, pay_status=OrderInfo.PAID).exists():  | 
            |
| 52 | 
                + if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_int, from_uid=user_id, pay_status=OrderInfo.PAID).exists():  | 
            |
| 46 | 53 | 
                return response(OrderStatusCode.WX_ORDER_PAID_ALREADY_EXISTS)  | 
            
| 47 | 54 | 
                 | 
            
| 48 | 55 | 
                     body = request.POST.get('body', '')  # 商品描述
               | 
            
                @@ -69,7 +76,7 @@ def wx_order_create_api(request):  | 
            ||
| 69 | 76 | 
                group_id=group_id,  | 
            
| 70 | 77 | 
                photo_id=photo_id,  | 
            
| 71 | 78 | 
                lensman_photo_id=group_photo.lensman_photo_id,  | 
            
| 72 | 
                - photo_type=1 if photo_type == 'origin' else 0,  | 
            |
| 79 | 
                + photo_type=photo_type_int,  | 
            |
| 73 | 80 | 
                from_uid=from_uid,  | 
            
| 74 | 81 | 
                to_uid=to_uid,  | 
            
| 75 | 82 | 
                session_id=group_photo.session_id,  | 
            
                @@ -83,14 +90,14 @@ def wx_order_create_api(request):  | 
            ||
| 83 | 90 | 
                notify_url=settings.API_DOMAIN + '/wx/notify_url',  | 
            
| 84 | 91 | 
                out_trade_no=order.order_id,  | 
            
| 85 | 92 | 
                total_fee=total_fee,  | 
            
| 86 | 
                - trade_type=trade_type,  | 
            |
| 87 | 
                - # user_id=None, # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传  | 
            |
| 93 | 
                + trade_type=trade_type if trade_type != 'MINIAPP' else 'JSAPI',  | 
            |
| 94 | 
                + user_id=get_user_openid(user, trade_type), # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传  | 
            |
| 88 | 95 | 
                )  | 
            
| 89 | 96 | 
                except WeChatPayException:  | 
            
| 90 | 97 | 
                return response(OrderStatusCode.WX_UNIFIED_ORDER_FAIL)  | 
            
| 91 | 98 | 
                 | 
            
| 92 | 99 | 
                     prepay_id = prepay_data.get('prepay_id', '')
               | 
            
| 93 | 
                - if trade_type == 'JSAPI':  | 
            |
| 100 | 
                + if trade_type == 'JSAPI' or trade_type == 'MINIAPP':  | 
            |
| 94 | 101 | 
                wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id)  | 
            
| 95 | 102 | 
                elif trade_type == 'APP':  | 
            
| 96 | 103 | 
                wxpay_params = wxpay.order.get_appapi_params(prepay_id)  | 
            
                @@ -0,0 +1,13 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +def get_user_openid(user, trade_type):  | 
            |
| 5 | 
                + if trade_type == 'MINIAPP':  | 
            |
| 6 | 
                + openid = user.openid_miniapp  | 
            |
| 7 | 
                + elif trade_type == 'JSAPI':  | 
            |
| 8 | 
                + openid = user.openid_oauth  | 
            |
| 9 | 
                + elif trade_type == 'APP':  | 
            |
| 10 | 
                + openid = None  | 
            |
| 11 | 
                + else:  | 
            |
| 12 | 
                + openid = None  | 
            |
| 13 | 
                + return openid  | 
            
                @@ -0,0 +1,13 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +def get_user_openid(user, trade_type):  | 
            |
| 5 | 
                + if trade_type == 'MINIAPP':  | 
            |
| 6 | 
                + openid = user.openid_miniapp  | 
            |
| 7 | 
                + elif trade_type == 'JSAPI':  | 
            |
| 8 | 
                + openid = user.openid_oauth  | 
            |
| 9 | 
                + elif trade_type == 'APP':  | 
            |
| 10 | 
                + openid = None  | 
            |
| 11 | 
                + else:  | 
            |
| 12 | 
                + openid = None  | 
            |
| 13 | 
                + return openid  |